package com.yc.cloud.admin.service.impl;

import com.yc.cloud.admin.enums.SnapMethodEnum;
import com.yc.cloud.admin.service.MediaKitApiService;
import com.yc.cloud.admin.service.SnapshotService;
import com.yc.cloud.admin.utils.FFmpegUtils;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.io.File;
import java.nio.file.Files;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Base64;

/**
 * 截图服务实现类
 * 
 * @author kinggu
 * @since 2025-10-10
 */
@Slf4j
@Service
public class SnapshotServiceImpl implements SnapshotService {
    
    @Resource
    private FFmpegUtils ffmpegUtils;
    
    @Resource
    private MediaKitApiService mediaKitApiService;
    
    @Override
    public String captureSnapshot(String streamUrl, String snapMethod) {
        // 根据截图方式选择不同的实现
        SnapMethodEnum method = SnapMethodEnum.fromCode(snapMethod);
        
        switch (method) {
            case FFMPEG:
                return captureWithFFmpeg(streamUrl);
                
            case MEDIAKIT:
            default:
                return captureWithMediaKit(streamUrl);
        }
    }
    
    /**
     * 使用 FFmpeg 从流地址截图并返回 Base64
     * 
     * @param streamUrl 流地址
     * @return Base64 编码的图片数据
     */
    private String captureWithFFmpeg(String streamUrl) {
        File tempFile = null;
        try {
            log.info("使用 FFmpeg 截图，URL: {}", streamUrl);
            
            // 生成临时文件路径
            String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss_SSS"));
            String tempDir = System.getProperty("java.io.tmpdir");
            String outputPath = tempDir + File.separator + "ffmpeg_snap_" + timestamp + ".jpg";
            tempFile = new File(outputPath);
            
            // 使用 FFmpeg 从流截图
            String capturedPath = ffmpegUtils.captureFrameFromStream(streamUrl, outputPath);
            
            if (capturedPath == null || !tempFile.exists()) {
                log.error("FFmpeg 截图失败，未生成文件");
                return null;
            }
            
            // 读取图片文件并转换为 Base64
            byte[] imageBytes = Files.readAllBytes(tempFile.toPath());
            String base64Image = Base64.getEncoder().encodeToString(imageBytes);
            
            log.info("FFmpeg 截图成功，文件大小: {} bytes", imageBytes.length);
            return base64Image;
            
        } catch (Exception e) {
            log.error("FFmpeg 截图异常: streamUrl={}", streamUrl, e);
            return null;
        } finally {
            // 清理临时文件
            if (tempFile != null && tempFile.exists()) {
                try {
                    tempFile.delete();
                    log.debug("已删除临时截图文件: {}", tempFile.getPath());
                } catch (Exception e) {
                    log.warn("删除临时截图文件失败: {}", tempFile.getPath(), e);
                }
            }
        }
    }
    
    /**
     * 使用 MediaKit API 截图
     * 
     * @param streamUrl 流地址
     * @return Base64 编码的图片数据
     */
    private String captureWithMediaKit(String streamUrl) {
        try {
            log.info("使用 MediaKit API 截图，URL: {}", streamUrl);
            return mediaKitApiService.getSnap(streamUrl);
        } catch (Exception e) {
            log.error("MediaKit API 截图异常: streamUrl={}", streamUrl, e);
            return null;
        }
    }
}

